package com.example.servicegateway.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;

import java.util.Arrays;

/**
 * 跨域配置类
 * 
 * 功能说明：
 * 1. 配置跨域资源共享（CORS）策略
 * 2. 允许前端应用从不同域名访问API
 * 3. 支持预检请求（OPTIONS）处理
 * 4. 提供安全的跨域访问控制
 * 
 * @author Spring Cloud Demo
 * @version 1.0
 * @since 2024-01-01
 */
@Configuration
public class CorsConfig {

    /**
     * 配置跨域过滤器
     * 
     * 配置说明：
     * 1. 允许的源：支持多个前端域名
     * 2. 允许的方法：GET、POST、PUT、DELETE、OPTIONS等
     * 3. 允许的请求头：包括认证相关的请求头
     * 4. 允许的响应头：包括自定义响应头
     * 5. 是否允许携带凭证：支持Cookie等凭证信息
     * 6. 预检请求缓存时间：减少OPTIONS请求频率
     * 
     * @return 跨域过滤器
     */
    @Bean
    public CorsWebFilter corsWebFilter() {
        // 创建跨域配置对象
        CorsConfiguration corsConfig = new CorsConfiguration();
        
        // 配置允许的源（域名）
        corsConfig.setAllowedOriginPatterns(Arrays.asList(
                "http://localhost:*",           // 本地开发环境
                "http://127.0.0.1:*",          // 本地开发环境
                "https://*.example.com",       // 生产环境域名（示例）
                "https://*.yourdomain.com"     // 其他域名（示例）
        ));
        
        // 配置允许的HTTP方法
        corsConfig.setAllowedMethods(Arrays.asList(
                "GET",      // 获取资源
                "POST",     // 创建资源
                "PUT",      // 更新资源
                "DELETE",   // 删除资源
                "OPTIONS",  // 预检请求
                "PATCH"     // 部分更新
        ));
        
        // 配置允许的请求头
        corsConfig.setAllowedHeaders(Arrays.asList(
                "Origin",                    // 请求来源
                "Content-Type",              // 内容类型
                "Accept",                    // 接受的内容类型
                "Authorization",             // 认证信息
                "X-Requested-With",          // AJAX请求标识
                "X-User-Id",                 // 用户ID
                "X-Gateway-Source",          // 网关来源标识
                "Cache-Control",             // 缓存控制
                "Pragma"                     // 缓存控制
        ));
        
        // 配置允许的响应头
        corsConfig.setExposedHeaders(Arrays.asList(
                "X-Gateway-Response",        // 网关响应标识
                "X-RateLimit-Limit",         // 限流限制
                "X-RateLimit-Remaining",     // 限流剩余
                "X-RateLimit-Reset",         // 限流重置时间
                "X-User-Id",                 // 用户ID
                "Access-Control-Allow-Origin", // 允许的源
                "Access-Control-Allow-Credentials" // 允许的凭证
        ));
        
        // 配置是否允许携带凭证（Cookie、Authorization等）
        corsConfig.setAllowCredentials(true);
        
        // 配置预检请求的缓存时间（秒）
        // 浏览器会缓存预检请求的结果，减少OPTIONS请求的频率
        corsConfig.setMaxAge(3600L); // 1小时
        
        // 创建基于URL的跨域配置源
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        
        // 为所有路径应用跨域配置
        source.registerCorsConfiguration("/**", corsConfig);
        
        // 创建并返回跨域过滤器
        return new CorsWebFilter(source);
    }
} 